Zwei Typen von Schleifen:
while-Schleifen: Wiederholung solange Bedingung wahr istfor-Schleifen: Wiederholung über eine feste Anzahl oder Sammlungwhile-SchleifenWas ist eine while-Schleife?
Typische Anwendungsfälle:
Die Schleife läuft solange i < 3 wahr ist und zählt dabei von 0 bis 2.
i = 0
while i < 3:
print(i)
i += 1
Wenn die Zählvariable nicht verändert wird, bleibt die Bedingung immer wahr und die Schleife läuft endlos.
# Schlechte Idee: i wird nie verändert → Endlosschleife
i = 0
while i < 3:
print(i)
# i += 1 # vergessen!
Mehrere Bedingungen können kombiniert werden, um komplexere Abbruchkriterien zu definieren.
schritte = 0
energie = 10
while energie > 0 and schritte < 5:
print(f"Schritt {schritte}: Energie = {energie}")
energie -= 3
schritte += 1
Die Schleife liest Werte ein, bis ein spezieller Sentinel-Wert (hier: leerer String) eingegeben wird.
zeile = input("Wert (leer beendet): ")
while zeile != "":
print(f"Eingabe war: {zeile}")
zeile = input("Wert (leer beendet): ")
Die Schleife läuft, bis ein Zielwert mit einer definierten Genauigkeit erreicht ist.
temp = 20.0
ziel = 22.0
schritt = 0.2
iters = 0
while abs(temp - ziel) > 0.1 and iters < 200:
temp += schritt
iters += 1
print(f"Endtemperatur {temp:.1f}°C nach {iters} Schritten")
break und continue mit whilecontinue überspringt den Rest des aktuellen Durchlaufs, break beendet die Schleife sofort.
# Suche die erste ungerade Zahl > 15 unter den Zahlen 1–20
nummer = 0
gefunden = None
while nummer <= 20:
nummer += 1
if nummer % 2 == 0:
continue # überspringen (gerade Zahlen)
if nummer > 15:
gefunden = nummer
break # abbrechen (erste ungerade > 15)
print(f"Prüfe: {nummer}")
print(f"Gefunden: {gefunden}")
Entwirf eine Regelung, die eine Geschwindigkeit v auf v_target bringt.
max_steps erreichtfor-SchleifenTypische Anwendungsfälle:
for: Wiederholungen mit range()range(n) erzeugt Zahlen von 0 bis n-1 und ermöglicht damit eine feste Anzahl von Wiederholungen.
for i in range(5): # 0, 1, 2, 3, 4
print(f"Durchlauf {i}")
range(): Integer-Folgen erzeugenrange() ist ein spezieller Typ, der Zahlenfolgen effizient erzeugt, ohne sie alle im Speicher zu halten.
for i in range(5): # 0,1,2,3,4
print(i)
print(range(5)) # range ist ein spezieller Typ
range(start, stop) und range(start, stop, step)Mit Start-, Stop- und Schrittweite können beliebige Zahlenfolgen erzeugt werden, auch rückwärts.
for i in range(2, 7): # 2,3,4,5,6
print(i)
for t in range(10, -1, -2): # 10,8,6,4,2,0
print(t)
Strings können direkt mit for durchlaufen werden, um Zeichen für Zeichen zu verarbeiten.
for ch in "ABCD":
print(ch)
wort = "NASA"
for buchstabe in wort:
print(f"Buchstabe: {buchstabe}")
Eine Schleife über einen String ermöglicht das Zählen bestimmter Zeichen durch bedingte Inkrementierung.
text = "Programmieren"
anzahl_e = 0
for zeichen in text:
if zeichen == "e":
anzahl_e += 1
print(f"Anzahl 'e': {anzahl_e}")
break und continue in for-SchleifenAuch in for-Schleifen können continue und break verwendet werden, um die Ausführung zu steuern.
for zahl in range(1, 11):
if zahl % 3 == 0:
continue # Überspringe Vielfache von 3
if zahl > 7:
break # Stoppe bei Zahlen > 7
print(zahl)
Schleifen können ineinander verschachtelt werden, um über mehrdimensionale Strukturen zu iterieren.
for i in range(1, 4):
for j in range(1, 4):
print(f"{i} × {j} = {i*j}")
print("---") # Trenner nach jeder Zeile
Schreibe eine Funktion, die die Quersumme einer positiven Ganzzahl berechnet.
int und addiereAufgaben:
Erste Entscheidung:
| Funktion | Skript |
|---|---|
| Wiederverwendbarer Baustein | Vollständiges Programm |
Parameter → return |
input() → print() |
Beispiel: def quadrat(x) |
Beispiel: Taschenrechner |
Faustregel:
Hinweis: Skripte können auch Funktionen enthalten!
Schritt 1: Signatur klären
def funktionsname(parameter1, parameter2):
# Was kommt rein? Was kommt raus?
return ergebnis
Fragen:
returnSchritt 2: Implementieren
Schirtt 3: Testen
Denken Sie in 3 Phasen: Eingabe → Verarbeitung → Ausgabe
# 1. EINGABE
name = input("Name? ")
alter = int(input("Alter? "))
# 2. VERARBEITUNG
geburtsjahr = 2024 - alter
# 3. AUSGABE
print(f"Hallo {name}!")
print(f"Geboren ca. {geburtsjahr}")
Bisher: einzelne Werte in Variablen
messung_1 = 15.2
messung_2 = 16.1
messung_3 = 14.8
messung_4 = 15.9
# ...
Problem: Unhandlich bei vielen Werten!
Lösung: Datenstrukturen gruppieren zusammengehörige Daten
| Typ | Geordnet | Veränderbar | Duplikate | Verwendung |
|---|---|---|---|---|
| Liste | Allgemeine Sammlung | |||
| Tupel | Unveränderliche Daten | |||
| Dictionary | Key-Value-Paare | |||
| Set | Eindeutige Elemente | |||
| NumPy-Array | Numerische Berechnungen |
Listen werden mit eckigen Klammern [] erstellt und können beliebig viele Elemente enthalten.
# Leere Liste
messungen = []
print(messungen)
# Liste mit Werten
temperaturen = [20.5, 21.2, 19.8, 22.1]
print(temperaturen)
Mit list() können andere Objekte in Listen umgewandelt werden.
# Aus range() erstellen
gerade_zahlen = list(range(0, 10, 2))
print(gerade_zahlen)
# Aus String erstellen
buchstaben = list("Python")
print(buchstaben)
Der Index startet bei 0. Negative Indizes zählen vom Ende her.
planeten = ["Merkur", "Venus", "Erde", "Mars"]
print(planeten[0]) # Erstes Element
print(planeten[2]) # Drittes Element
print(planeten[-1]) # Letztes Element
Mit [start:stop:step] können Teillisten extrahiert werden.
zahlen = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(zahlen[2:5]) # Index 2 bis 4 (5 exklusiv)
print(zahlen[:4]) # Vom Anfang bis Index 3
print(zahlen[6:]) # Von Index 6 bis zum Ende
print(zahlen[::2]) # Jedes zweite Element
Die Funktion len() gibt die Anzahl der Elemente zurück.
sensoren = ["Temperatur", "Druck", "Beschleunigung"]
anzahl = len(sensoren)
print(f"Anzahl Sensoren: {anzahl}")
append() fügt am Ende hinzu, insert() an beliebiger Position.
missionen = ["Apollo 11", "Apollo 13"]
print(f"Vorher: {missionen}")
missionen.append("Artemis I")
print(f"Nach append: {missionen}")
missionen.insert(1, "Apollo 12")
print(f"Nach insert: {missionen}")
remove() entfernt nach Wert, pop() entfernt an Position und gibt das Element zurück.
werte = [10, 20, 30, 40, 50]
werte.remove(30) # Entfernt das erste Vorkommen von 30
print(f"Nach remove: {werte}")
letzter = werte.pop() # Entfernt und gibt letztes Element zurück
print(f"Entfernt: {letzter}, Übrig: {werte}")
Mit in prüfen, ob ein Element vorhanden ist.
komponenten = ["Triebwerk", "Tank", "Avionik", "Tank"]
print("Avionik" in komponenten) # Prüfen ob Element vorhanden
print("Kabine" in komponenten)
Die Methode sort() sortiert die Liste direkt (in-place), sorted() gibt eine neue sortierte Liste zurück.
hoehen = [350, 120, 280, 95, 410]
hoehen.sort() # Sortiert die Liste direkt
print(hoehen)
werte = [350, 120, 280, 95, 410]
sortiert = sorted(werte) # Gibt neue Liste zurück
print(f"Original: {werte}")
print(f"Sortiert: {sortiert}")
Mit for-Schleifen können alle Elemente durchlaufen werden.
treibstoffe = ["RP-1", "LOX", "LH2"]
for treibstoff in treibstoffe:
print(f"Treibstoff: {treibstoff}")
Gegeben: Liste mit Temperaturen einer Woche in °C
temperaturen = [15.2, 16.8, 14.5, 18.3, 17.1, 16.9, 15.8]
Aufgaben:
Verwendung:
Tupel werden mit runden Klammern () erstellt.
# Mit runden Klammern
koordinaten = (51.5, 0.1)
print(koordinaten)
# Ohne Klammern (tuple packing)
position = 10.0, 20.0, 30.0
print(position)
Tupel verwenden die gleiche Indexierung wie Listen.
launch_daten = ("Falcon 9", "2023-10-05", 70.0, True)
print(launch_daten[0])
print(launch_daten[-1])
Tupel-Elemente können direkt mehreren Variablen zugewiesen werden.
koordinaten = (48.1, 11.6)
latitude, longitude = koordinaten
print(f"Breitengrad: {latitude}, Längengrad: {longitude}")
# Werte tauschen (sehr elegant in Python!)
a = 5
b = 10
a, b = b, a
print(f"a={a}, b={b}")
Nach der Erstellung können Tupel-Elemente nicht mehr geändert werden.
punkt = (10, 20)
# punkt[0] = 15 # TypeError: 'tuple' object does not support item assignment
print(punkt)
Listen verwenden:
Tupel verwenden:
Funktionen können mehrere Werte als Tupel zurückgeben.
def berechne_kreisflaeche(radius):
pi = 3.14159
flaeche = pi * radius ** 2
umfang = 2 * pi * radius
return flaeche, umfang # Gibt Tupel zurück
# Unpacking bei Funktionsaufruf
a, u = berechne_kreisflaeche(5.0)
print(f"Fläche: {a:.2f}, Umfang: {u:.2f}")
Verwendung:
Dictionaries werden mit geschweiften Klammern {} und Doppelpunkt : erstellt.
# Mit Werten
astronaut = {
"name": "Neil Armstrong",
"mission": "Apollo 11",
"alter": 38,
"gestartet": True
}
print(astronaut)
Werte werden über ihren Schlüssel (Key) abgerufen.
print(astronaut["name"])
# Mit get() - sicherer bei fehlenden Keys
print(astronaut.get("mission"))
# Standardwert wenn Key nicht existiert
print(astronaut.get("geburtsort", "Unbekannt"))
Neue Keys werden einfach hinzugefügt, bestehende werden überschrieben.
rakete = {"name": "Falcon 9", "stufen": 2}
# Neuen Eintrag hinzufügen
rakete["hersteller"] = "SpaceX"
print(rakete)
# Wert ändern
rakete["stufen"] = 3
print(rakete)
Mit .items() können Keys und Values gleichzeitig durchlaufen werden.
sensoren = {"temp": 23.5, "druck": 1015, "luftf": 45}
# Über Key-Value-Paare
for key, value in sensoren.items():
print(f"{key} = {value}")
Dictionaries können andere Dictionaries enthalten – nützlich für strukturierte Daten.
flugzeuge = {
"A380": {
"hersteller": "Airbus",
"sitze": 853,
"reichweite_km": 15200
},
"B787": {
"hersteller": "Boeing",
"sitze": 242,
"reichweite_km": 14140
}
}
print(flugzeuge["A380"]["sitze"])
Schreibe ein Programm, das zählt, wie oft jedes Wort in einem Text vorkommt.
Gegeben:
text = "Python ist toll Python macht Spass toll toll"
Aufgabe: Erstelle ein Dictionary mit der Worthäufigkeit.
Tipp: Verwende .split() um den Text in Wörter zu teilen.
Erwartetes Ergebnis: {"Python": 2, "ist": 1, "toll": 3, ...}
Verwendung:
Sets werden mit geschweiften Klammern {} erstellt und entfernen Duplikate automatisch.
# Duplikate werden automatisch entfernt
zahlen = {1, 2, 2, 3, 3, 3, 4}
print(zahlen)
# Aus Liste erstellen
liste = [1, 1, 2, 2, 3, 3]
eindeutig = set(liste)
print(eindeutig)
Der häufigste Anwendungsfall: Duplikate aus Listen entfernen.
messungen = [15.2, 16.1, 15.2, 17.3, 16.1, 14.8]
eindeutig = list(set(messungen))
print(eindeutig)
# Sortiert
sortiert_eindeutig = sorted(set(messungen))
print(sortiert_eindeutig)
Sets verwenden:
Listen verwenden:
Dictionaries verwenden:
NumPy (Numerical Python) ist die Standardbibliothek für numerische Berechnungen in Python.
NumPy-Arrays:
Installation: pip install numpy
NumPy-Arrays sind wie Listen, aber optimiert für numerische Berechnungen.
import numpy as np
# Liste zu Array
messungen = np.array([15.2, 16.1, 14.8, 17.3])
print(messungen)
print(type(messungen))
NumPy erlaubt vektorisierte Operationen – viel einfacher und schneller!
# Listen: Element für Element mit Schleife
liste = [1, 2, 3, 4]
verdoppelt = []
for x in liste:
verdoppelt.append(x * 2)
print(verdoppelt)
# NumPy: Vektorisiert (alle auf einmal!)
array = np.array([1, 2, 3, 4])
print(array * 2)
NumPy bietet viele mathematische Funktionen für Arrays.
werte = np.array([1, 4, 9, 16, 25])
wurzel = np.sqrt(werte)
print(f"Wurzel: {wurzel}")
quadrat = werte ** 2
print(f"Quadrat: {quadrat}")
NumPy bietet Funktionen für statistische Berechnungen.
temperaturen = np.array([15.2, 16.8, 14.5, 18.3, 17.1])
print(f"Mittelwert: {np.mean(temperaturen):.2f}")
print(f"Min: {np.min(temperaturen)}, Max: {np.max(temperaturen)}")
NumPy unterstützt auch mehrdimensionale Arrays (Matrizen).
# 2D-Array (Matrix)
matrix = np.array([
[1, 2, 3],
[4, 5, 6]
])
print(matrix)
print(f"Shape: {matrix.shape}") # (Zeilen, Spalten)
| NumPy-Arrays | Python-Listen | |
|---|---|---|
| Geschwindigkeit | ||
| Speicher | ||
| Operationen | ||
| Datentypen | ||
| Größe |
Faustregel: NumPy für numerische Berechnungen, Listen für alles andere!
| Typ | Verwendung | Beispiel |
|---|---|---|
| Liste | Geordnete, veränderbare Sammlung | [1, 2, 3] |
| Tupel | Unveränderbare Daten, mehrere Rückgabewerte | (x, y, z) |
| Dictionary | Key-Value-Paare, strukturierte Daten | {"name": "ISS", "crew": 7} |
| Set | Eindeutige Elemente, Mengenoperationen | {1, 2, 3} |
| NumPy-Array | Numerische Berechnungen | np.array([1, 2, 3]) |
Wichtigste Entscheidung: Welche Struktur passt zu meinen Daten?
Gegeben: Messdaten von 5 Flügen
fluege = {
"LH123": {"distanz_km": 850, "dauer_min": 95, "passagiere": 145},
"BA456": {"distanz_km": 1200, "dauer_min": 135, "passagiere": 180},
"AF789": {"distanz_km": 650, "dauer_min": 80, "passagiere": 120},
"KL321": {"distanz_km": 950, "dauer_min": 110, "passagiere": 155},
"LX654": {"distanz_km": 720, "dauer_min": 85, "passagiere": 130}
}
Aufgaben:
Problem: Nicht alles selbst programmieren!
Lösung: Module – vorgefertigte Sammlungen von Funktionen
Analogie:
Vorteile:
Ein Modul ist eine Python-Datei (.py), die Funktionen, Klassen und Variablen enthält.
Beispiel: Eine Datei umrechnung.py könnte enthalten:
def fuss_zu_meter(fuss):
return fuss * 0.3048
def seemeilen_zu_km(seemeilen):
return seemeilen * 1.852
Das ist ein Modul! Es kann in anderen Programmen wiederverwendet werden.
Module ermöglichen:
Python kommt mit einer umfangreichen Standardbibliothek – eine Sammlung von Modulen, die direkt verfügbar sind.
Wichtige Module (Auswahl):
| Modul | Beschreibung |
|---|---|
math |
Mathematische Funktionen |
random |
Zufallszahlen |
datetime |
Datum und Zeit |
os |
Betriebssystem-Funktionen |
json |
JSON-Daten verarbeiten |
re |
Reguläre Ausdrücke |
Dokumentation: https://docs.python.org/3/library/
Drei wichtige Import-Varianten:
# 1. Ganzes Modul importieren
import math
ergebnis = math.sqrt(16)
print(ergebnis)
# 2. Einzelne Funktionen importieren
from math import sqrt, pi
ergebnis = sqrt(16)
print(f"π = {pi:.5f}")
# 3. Modul mit Alias importieren
import math as m
ergebnis = m.sqrt(16)
print(ergebnis)
math-Modul: Mathematische FunktionenDas math-Modul bietet grundlegende mathematische Funktionen und Konstanten.
import math
# Konstanten
print(f"π = {math.pi:.5f}")
print(f"e = {math.e:.5f}")
# Grundfunktionen
print(f"√16 = {math.sqrt(16)}")
print(f"2³ = {math.pow(2, 3)}")
print(f"⌊3.7⌋ = {math.floor(3.7)}")
print(f"⌈3.2⌉ = {math.ceil(3.2)}")
Das math-Modul enthält alle wichtigen trigonometrischen Funktionen (arbeiten mit Radiant!).
import math
# Umrechnung Grad → Radiant
winkel_grad = 45
winkel_rad = math.radians(winkel_grad)
print(f"sin(45°) = {math.sin(winkel_rad):.4f}")
print(f"cos(45°) = {math.cos(winkel_rad):.4f}")
print(f"tan(45°) = {math.tan(winkel_rad):.4f}")
Berechnung der Wurfweite bei schrägen Wurf mit math.
import math
def wurfweite(v0, winkel_grad):
"""Wurfweite bei schrägen Wurf (ohne Luftwiderstand)"""
g = 9.81 # m/s²
winkel_rad = math.radians(winkel_grad)
weite = (v0**2 * math.sin(2 * winkel_rad)) / g
return weite
# Beispiel: Kanonenkugel
geschwindigkeit = 100 # m/s
winkel = 45 # Grad
weite = wurfweite(geschwindigkeit, winkel)
print(f"Wurfweite: {weite:.1f} m")
random-Modul: ZufallszahlenDas random-Modul erzeugt Pseudozufallszahlen – wichtig für Simulationen und Spiele.
import random
# Zufällige Gleitkommazahl zwischen 0 und 1
print(random.random())
# Zufällige Ganzzahl in einem Bereich
wuerfel = random.randint(1, 6)
print(f"Würfelwurf: {wuerfel}")
# Zufälliges Element aus Liste
farben = ["rot", "grün", "blau", "gelb"]
zufall = random.choice(farben)
print(f"Zufällige Farbe: {zufall}")
Mit seed() können Zufallszahlen reproduzierbar gemacht werden – wichtig für Tests!
import random
# Mit Seed: Immer gleiche "Zufalls"-Folge
random.seed(42)
print(random.randint(1, 100))
print(random.randint(1, 100))
# Nochmal mit gleichem Seed
random.seed(42)
print(random.randint(1, 100))
print(random.randint(1, 100))
Schätzung von π durch zufällige Punkte im Einheitsquadrat.
import random
def schaetze_pi(n):
"""Schätzt π mit Monte-Carlo-Methode"""
treffer = 0
for _ in range(n):
x = random.random()
y = random.random()
if x**2 + y**2 <= 1: # Punkt im Viertelkreis?
treffer += 1
return 4 * treffer / n
# Mit unterschiedlichen Stichprobengrößen
print(f"π ≈ {schaetze_pi(1000):.4f} (1.000 Punkte)")
print(f"π ≈ {schaetze_pi(100000):.4f} (100.000 Punkte)")
Empfohlen:
import math
import random
# Klar, woher Funktionen kommen
x = math.sqrt(16)
y = random.randint(1, 10)
Vermeiden:
from math import *
from random import *
# Unklar, woher sqrt kommt - Namenskonflikte möglich!
x = sqrt(16)
Faustregel: Immer explizite Imports – besser lesbar und wartbar!
Python bietet eingebaute Hilfe für Module und Funktionen.
import math
# Alle Funktionen eines Moduls anzeigen
print(dir(math))
# Hilfe zu einer Funktion
help(math.sqrt)
Tipp: In Jupyter Notebook: ? für Hilfe, z.B. math.sqrt?
Simuliere einen Raketenstart mit Zufallselementen.
Aufgaben:
random und mathrandom.seed(i) für i von 0 bis 4Erwartete Ausgabe: 5 verschiedene Szenarien mit jeweils 3 Werten
Standardbibliothek reicht nicht immer!
Die Python-Community hat Tausende spezialisierte Module entwickelt:
| Bereich | Beispiele |
|---|---|
| Wissenschaft | numpy, scipy, pandas |
| Visualisierung | matplotlib, plotly, seaborn |
| Web | requests, flask, django |
| Machine Learning | scikit-learn, tensorflow, pytorch |
PyPI (Python Package Index): https://pypi.org/ – über 500.000 Pakete!
pip = "Pip Installs Packages" (rekursives Akronym)
Analogie:
Grundlegende Befehle:
# Paket installieren
pip install paketname
# Bestimmte Version installieren
pip install paketname==1.2.3
# Paket aktualisieren
pip install --upgrade paketname
# Paket deinstallieren
pip uninstall paketname
# Installierte Pakete auflisten
pip list
Jede Python-Datei ist ein Modul!
Erstelle eine Datei physik.py:
"""Physikalische Konstanten und Berechnungen"""
# Konstanten
LICHTGESCHWINDIGKEIT = 299792458 # m/s
GRAVITATIONSKONSTANTE = 6.67430e-11 # m³/(kg·s²)
def energie_masse(masse):
"""Berechnet Energie aus Masse: E = mc²"""
return masse * LICHTGESCHWINDIGKEIT ** 2
def freier_fall_geschwindigkeit(hoehe):
"""Geschwindigkeit im freien Fall"""
g = 9.81 # m/s²
return (2 * g * hoehe) ** 0.5
Verwendung in einer anderen Datei (z.B. main.py im gleichen Verzeichnis):
import physik
# Konstanten verwenden
print(f"c = {physik.LICHTGESCHWINDIGKEIT:,} m/s")
# Funktionen verwenden
masse = 0.001 # kg (1 Gramm)
energie = physik.energie_masse(masse)
print(f"Energie von 1g: {energie:.2e} Joule")
# Freier Fall aus 100m
v = physik.freier_fall_geschwindigkeit(100)
print(f"Geschwindigkeit: {v:.1f} m/s")
Wichtig: Beide Dateien müssen im gleichen Verzeichnis liegen!
if __name__ == "__main__"Problem: Code soll nur beim direkten Aufruf ausgeführt werden, nicht beim Import.
# test_modul.py
def berechne_etwas(x):
return x * 2
# Dieser Block wird nur bei direktem Aufruf ausgeführt
if __name__ == "__main__":
# Tests oder Beispiele hier
print("Teste das Modul:")
print(berechne_etwas(5))
print(berechne_etwas(10))
Verwendung:
python test_modul.py → Tests werden ausgeführtimport test_modul → Nur Funktion verfügbar, keine AusgabeFür größere Projekte: Module in Paketen organisieren
mein_projekt/
├── main.py
└── physik/
├── __init__.py # Macht physik zum Paket
├── mechanik.py
├── thermodynamik.py
└── elektrik.py
Verwendung:
from physik.mechanik import freier_fall
from physik.elektrik import ohmsches_gesetz
Hinweis: Pakete sind komplexer – für größere Projekte relevant!
Zwei sprachunabhängige Werkzeuge zur Planung von Algorithmen
Ziel: Systematisches Vorgehen beim Programmieren
Definition: Eine eindeutige, schrittweise Handlungsvorschrift zur Lösung eines Problems
Eigenschaften:
Problem: Finde die größte Zahl in einer Liste
Algorithmus in Alltagssprache:
Problem: Noch nicht präzise genug für die Umsetzung in Code!
algorithmus finde_maximum(liste):
maximum = erstes Element der Liste
für jedes weitere Element in liste:
wenn Element größer als maximum:
maximum = Element
gib maximum zurück
Das Problem beim Programmieren:
Trennung der Probleme
Pseudocode = Zwischenschritt zwischen Alltagssprache und Programmcode
Eigenschaften:
Ziel: Die Was-Frage beantworten, bevor man sich mit der Wie-Frage beschäftigt
Motto: Erst denken, dann coden!
Anweisungen:
variable = wert
ausgabe "Text"
Verzweigungen:
wenn bedingung:
anweisungen
sonst:
anweisungen
Schleifen:
für i von 1 bis n:
anweisungen
Pseudocode:
algorithmus finde_maximum(liste):
maximum = erstes Element von liste
für jedes weitere Element in liste:
wenn Element größer als maximum:
maximum = Element
gib maximum zurück
Vorteile: Logik ist klar, keine Syntax-Sorgen
Pseudocode:
algorithmus finde_maximum(liste):
maximum = erstes Element der Liste
für jedes weitere Element in liste:
wenn Element größer als maximum:
maximum = Element
gib maximum zurück
Python:
def finde_maximum(liste):
maximum = liste[0]
for zahl in liste:
if zahl > maximum:
maximum = zahl
return maximum
Problem: Prüfe, ob eine Zahl gerade ist
Pseudocode:
algorithmus ist_gerade(n):
wenn n ohne Rest durch 2 teilbar:
gib True zurück
sonst:
gib False zurück
Python:
def ist_gerade(n):
if n % 2 == 0:
return True
else:
return False
Aufgabe: Schreiben Sie Pseudocode für folgende Funktion aus dem letzten Praktikum:
def ist_prim(zahl):
"""Gibt aus, ob `zahl` eine Primzahl ist."""
if zahl == 1:
return False
for teiler in range(2, zahl):
if zahl % teiler == 0:
return False
if teiler**2 > zahl:
break
return True
Struktogramme = Grafische Darstellung von Algorithmen
Entwickelt von: Nassi & Shneiderman (1973)
Ziel: Strukturiertes Programmieren fördern
Jeder Algorithmus besteht aus drei Grundelementen:
Struktogramme stellen diese Strukturen grafisch dar.
Jedes Struktogramm ist ein Rechteck
Sequenz = Anweisungen nacheinander ausführen
Beispiel in Python:
x = 5
y = 3
summe = x + y
print(summe)
Einfache Verzweigung = if ohne else
Beispiel in Python:
x = int(input("Gib eine Zahl ein: "))
if x > 0:
print("positiv")
Wichtig: Die Bedingung steht oben, der "Ja"-Zweig darunter
Zweiseitige Verzweigung = if-else
Beispiel in Python:
if x > 0:
print("positiv")
else:
print("nicht positiv")
Python:
n = int(input("Gib eine Zahl ein: "))
if n % 2 == 0:
print("gerade")
else:
print("ungerade")
Python:
temp = float(input("Temperatur in °C: "))
if temp < 0:
print("Eis")
elif temp < 100:
print("Wasser")
else:
print("Dampf")
Zählschleife = for-Schleife mit festem Bereich
Beispiel in Python:
for i in range(1, 6):
print(i)
Bedingungsschleife = while-Schleife
Beispiel in Python:
i = 1
while i <= 5:
print(i)
i = i + 1
Strukturen können ineinander verschachtelt werden.
Beispiel: Verzweigung in einer Schleife
Python:
for i in range(1, 6):
if i % 2 == 0:
print(f"{i} ist gerade")
else:
print(f"{i} ist ungerade")
Python:
def finde_maximum(liste):
maximum = liste[0]
for zahl in liste:
if zahl > maximum:
maximum = zahl
return maximum
Aufgabe: Erstellen Sie ein Struktogramm für folgende Funktion aus dem letzten Praktikum:
def ist_prim(zahl):
"""Gibt aus, ob `zahl` eine Primzahl ist."""
if zahl == 1:
return False
for teiler in range(2, zahl):
if zahl % teiler == 0:
return False
if teiler**2 > zahl:
break
return True
Pseudocode:
Struktogramme:
Wiederholung aus Kapitel 2:
"...", '...' oder """...""" erstellenf"{variable}", f"{wert:.2f}""
", Escape Sequences "\n", "\t", "\\", "\"", "\'"Heute:
Strings sind unveränderbare Sequenzen von Zeichen – man kann auf einzelne Zeichen zugreifen.
text = "Python"
print(f"Länge: {len(text)}")
print(f"Erstes Zeichen: {text[0]}")
print(f"Letztes Zeichen: {text[-1]}")
# Strings sind unveränderbar!
text = "Python"
# text[0] = "J" # TypeError!
# Stattdessen: neuen String erzeugen
text = "J" + text[1:]
print(text)
wort = "Python"
# 012345 (positive Indizes)
# -6-5-4-3-2-1 (negative Indizes)
print(wort[0]) # P
print(wort[5]) # n
print(wort[-1]) # n (letztes Zeichen)
print(wort[-2]) # o (vorletztes Zeichen)
Merke: Negative Indizes zählen von hinten – genau wie in Listen!
# Mit for-Schleife durch String iterieren
for zeichen in "Python":
print(zeichen)
# Mit Index und enumerate()
for i, zeichen in enumerate("Python"):
print(f"Index {i}: {zeichen}")
Syntax: string[start:stop:step] – alle drei Teile optional. Genau wie bei Listen!
alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
print(alphabet[0:5]) # ABCDE
print(alphabet[5:10]) # FGHIJ
print(alphabet[:5]) # ABCDE (start fehlt = 0)
print(alphabet[20:]) # UVWXYZ (stop fehlt = Ende)
print(alphabet[::2]) # ACEGIKMOQSUWY (jedes 2. Zeichen)
print(alphabet[::-1]) # Umkehrung!
nachricht = "Hallo Welt"
umgekehrt = nachricht[::-1]
print(umgekehrt)
Praktische Anwendung: Palindrom-Check
def ist_palindrom(text):
text = text.lower() # wandle in Kleinbuchstaben um – Details im nächsten Abschnitt
return text == text[::-1]
print(ist_palindrom("Anna"))
print(ist_palindrom("Lagerregal"))
print(ist_palindrom("Hallo"))
| Methode | Beschreibung |
|---|---|
upper(), lower() |
Groß-/Kleinschreibung |
strip(), lstrip(), rstrip() |
Whitespace entfernen |
split(), join() |
Trennen und Verbinden |
replace() |
Text ersetzen |
startswith(), endswith() |
Präfix/Suffix prüfen |
find(), count() |
Suchen und Zählen |
isdigit(), isalpha() |
Zeichentyp prüfen |
text = "Python Programmierung"
print(text.upper()) # PYTHON PROGRAMMIERUNG
print(text.lower()) # python programmierung
print(text.capitalize()) # Python programmierung
print(text.title()) # Python Programmierung
# Case-insensitiver Vergleich
email1 = "Max.Mustermann@Gmail.COM"
email2 = "max.mustermann@gmail.com"
print(email1.lower() == email2.lower())
casefold()Problem: lower() wandelt nur in Kleinbuchstaben um, entfernt aber nicht alle Fallunterscheidungen
# Beispiel: Deutsches ß
print("Straße".upper()) # STRASSE (ß → SS)
print("STRASSE".lower()) # strasse (SS → ss)
print("Straße".lower()) # straße (ß bleibt ß)
print("Straße".lower() == "STRASSE".lower()) # False (straße ≠ strasse)
casefold() ist aggressiver: entfernt alle Fallunterscheidungen (z.B. ß → ss)
print("Straße".casefold()) # strasse
print("STRASSE".casefold()) # strasse
print("Straße".casefold() == "STRASSE".casefold()) # True
Faustregel: Für case-insensitive Vergleiche immer casefold() verwenden!
# strip() entfernt Leerzeichen, Tabs, Newlines am Anfang/Ende
eingabe = " Hallo Welt \n"
print(f"'{eingabe}'")
print(f"'{eingabe.strip()}'")
# strip() kann auch andere Zeichen entfernen
url = "https://example.com/"
print(url.strip("/")) # https://example.com (nur / wird entfernt)
# lstrip() und rstrip() für links/rechts
pfad = "///home/user/file.txt"
print(pfad.lstrip("/")) # home/user/file.txt
# split() zerlegt String in Liste
satz = "Python ist eine tolle Sprache"
woerter = satz.split()
print(woerter)
# Mit Trennzeichen
csv_zeile = "Max,Mustermann,25,Berlin"
daten = csv_zeile.split(",")
print(daten)
# join() fügt Liste zu String zusammen
woerter = ["Python", "ist", "toll"]
satz = " ".join(woerter)
print(satz)
def umgekehrte_woerter(satz):
"""Kehrt die Reihenfolge der Wörter um."""
woerter = satz.split()
return " ".join(reversed(woerter))
satz = "Hallo Welt wie geht es dir"
print(umgekehrte_woerter(satz))
# Datenpfade normalisieren
pfad = "C:\\Users\\David\\Documents\\data.txt"
unix_pfad = pfad.replace("\\", "/")
print(unix_pfad)
# Telefonnummern normalisieren
telefon = "+49 (89) 123-456"
normalisiert = telefon.replace(" ", "").replace("(", "").replace(")", "").replace("-", "")
print(normalisiert)
# URL-Parameter entfernen
url = "https://example.com/seite.html?ref=123&utm=abc"
saubere_url = url.split("?")[0]
print(saubere_url)
dateiname = "bericht_2025.pdf"
if dateiname.endswith(".pdf"):
print("PDF-Datei gefunden")
url = "https://www.example.com"
if url.startswith("https://"):
print("Sichere Verbindung")
elif url.startswith("http://"):
print("Unsichere Verbindung")
# Mehrere Möglichkeiten prüfen (Tupel!)
bild = "foto.jpg"
if bild.endswith((".jpg", ".png", ".gif")):
print("Bilddatei")
# Textanalyse: Finde Position eines Keywords in einem Artikel
artikel = """Machine Learning revolutioniert die Industrie.
Deep Learning ermöglicht neue Anwendungen."""
# find() gibt Index zurück (oder -1 wenn nicht gefunden)
pos = artikel.find("Learning")
print(f"Erste Position von 'Learning': {pos}")
# count() zählt Vorkommen - praktisch für Keyword-Analyse
anzahl = artikel.count("Learning")
print(f"'Learning' kommt {anzahl}× vor")
# Praktisches Beispiel: Prüfe ob API-Response erfolgreich war
response = '{"status": "success", "data": {...}}'
if response.find('"status": "success"') != -1:
print("API-Aufruf erfolgreich")
# Verschiedene is*-Methoden
print("123".isdigit()) # True
print("12.3".isdigit()) # False (Punkt ist keine Ziffer!)
print("abc".isalpha()) # True
print("abc123".isalnum()) # True (Buchstaben oder Ziffern)
print(" ".isspace()) # True
# Praktisch für Validierung
alter = input("Alter: ")
if alter.isdigit():
print(f"Alter: {int(alter)}")
else:
print("Ungültige Eingabe")
def ist_gueltige_email(email):
"""Einfache E-Mail-Validierung (nicht vollständig!)."""
# Grundlegende Checks
if email.count("@") != 1:
return False
lokaler_teil, domain = email.split("@")
# Lokaler Teil und Domain dürfen nicht leer sein
if not lokaler_teil or not domain:
return False
# Domain muss einen Punkt enthalten
if "." not in domain:
return False
# Domain-Endung muss mindestens 2 Zeichen haben
endung = domain.split(".")[-1]
if len(endung) < 2:
return False
return True
# Tests
print(ist_gueltige_email("max@example.com"))
print(ist_gueltige_email("max@example"))
print(ist_gueltige_email("max.com"))
def parse_dateiname(pfad):
"""Extrahiert Informationen aus einem Dateipfad."""
# Letzten Teil des Pfads nehmen (Dateiname)
dateiname = pfad.split("/")[-1]
# Name und Erweiterung trennen
if "." in dateiname:
name, erweiterung = dateiname.rsplit(".", 1)
else:
name, erweiterung = dateiname, ""
return {
"pfad": pfad,
"dateiname": dateiname,
"name": name,
"erweiterung": erweiterung
}
info = parse_dateiname("/home/user/dokumente/bericht_2025.pdf")
print(info)
# Methoden können verkettet werden
text = " Python Programmierung "
# Mehrere Operationen hintereinander
ergebnis = text.strip().lower().replace(" ", "_")
print(ergebnis)
# Praktisch für Datenbereinigung
email = " Max.Mustermann@GMAIL.COM "
sauber = email.strip().lower()
print(sauber)
| Format | Bedeutung | Beispiel | Ergebnis |
|---|---|---|---|
.2f |
Fließkommazahl mit 2 Nachkommastellen | f"{3.14159:.2f}" |
3.14 |
.0f |
Fließkommazahl ohne Nachkommastellen | f"{3.14159:.0f}" |
3 |
d |
Ganzzahl (Integer) | f"{42:d}" |
42 |
>10 |
Rechtsbündig, Breite 10 | f"{42:>10}" |
42 |
<10 |
Linksbündig, Breite 10 | f"{'Hi':<10}" |
Hi |
^10 |
Zentriert, Breite 10 | f"{'Hi':^10}" |
Hi |
05d |
Mit Nullen auffüllen, Breite 5 | f"{42:05d}" |
00042 |
, |
Tausendertrennzeichen | f"{1000000:,}" |
1,000,000 |
.2% |
Prozent mit 2 Nachkommastellen | f"{0.1234:.2%}" |
12.34% |
Anwendung für tabellarische Ausgaben:
studenten = [
("Alice", 23, 1.7),
("Bob", 25, 2.3),
("Charlie", 22, 1.9)
]
# Header
print(f"{'Name':<10} {'Alter':>5} {'Note':>5}")
print("-" * 25)
# Daten
for name, alter, note in studenten:
print(f"{name:<10} {alter:>5} {note:>5.1f}")
Historischer Kontext:
Beispiel (Verschiebung = 3):
A B C D E F G ... X Y Z
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
D E F G H I J ... A B C
Klartext: HALLO
Geheimtext: KDOOR
Idee:
Beispiel (Verschiebung = 3):
Teil 1: Verschlüsselung
Schreibe eine Funktion caesar_verschluesseln(text, verschiebung), die einen Text verschlüsselt.
Anforderungen:
verschiebung PositionenBeispiel:
print(caesar_verschluesseln("HALLO WELT", 3)) # KDOOR ZHOW
Hinweise: alphabet.find(zeichen) für Position, text.upper() für Großbuchstaben
Teil 2: Entschlüsselung
Schreibe eine Funktion caesar_entschluesseln(text, verschiebung), die einen Caesar-verschlüsselten Text entschlüsselt.
Tipp: Überlege, wie Entschlüsselung und Verschlüsselung zusammenhängen!
Beispiel:
geheimtext = "KDOOR ZHOW"
klartext = caesar_entschluesseln(geheimtext, 3)
print(klartext) # HALLO WELT
Teil 3: Alle Schlüssel ausprobieren
Schreibe eine Funktion caesar_brechen(geheimtext), die alle 26 möglichen Verschiebungen ausprobiert.
Anforderungen:
"Verschiebung 3: HALLO WELT"Erkenntnis: Caesar-Verschlüsselung ist unsicher – nur 26 mögliche Schlüssel!
String-Grundlagen:
Wichtige Methoden:
upper(), lower()strip(), replace()split(), join()find(), count(), startswith(), endswith()isdigit(), isalpha(), etc.Gegeben ist ein Satz – kehre die Reihenfolge der Wörter um.
satz = "Leise rieselt der Schnee"
# Ziel:
# "Schnee der rieselt Leise"
Hinweise:
matplotlib ist die Standard-Bibliothek für Datenvisualisierung in Python.
Hauptmerkmale:
Installation: pip install matplotlib
pyplot ist das Hauptmodul für die Erstellung von Plots – ähnlich wie MATLAB.
import matplotlib.pyplot as plt
# Einfachster Plot
plt.plot([1, 2, 3, 4])
plt.show()
Konvention: Import als plt
plt.show()In Python-Skripten (Terminal):
plt.show() ist erforderlichIn Jupyter Notebooks:
plt.show() ist nicht nötigEin Plot zeigt die Beziehung zwischen x- und y-Werten.
import matplotlib.pyplot as plt
x = [0, 1, 2, 3, 4]
y = [0, 1, 4, 9, 16]
plt.plot(x, y)
plt.show()
Mit title(), xlabel() und ylabel() wird der Plot beschriftet.
import matplotlib.pyplot as plt
x = [0, 1, 2, 3, 4, 5]
y = [0, 1, 4, 9, 16, 25]
plt.plot(x, y)
plt.title("Quadratfunktion")
plt.xlabel("x-Werte")
plt.ylabel("y-Werte")
plt.show()
Mit grid() wird ein Gitter zum besseren Ablesen angezeigt.
import matplotlib.pyplot as plt
x = [0, 1, 2, 3, 4, 5]
y = [0, 1, 4, 9, 16, 25]
plt.plot(x, y)
plt.title("Quadratfunktion")
plt.xlabel("x")
plt.ylabel("y")
plt.grid(True)
plt.show()
Mehrere plot()-Aufrufe zeichnen mehrere Linien in denselben Plot.
import matplotlib.pyplot as plt
x = [0, 1, 2, 3, 4, 5]
y1 = [0, 1, 4, 9, 16, 25]
y2 = [0, 2, 8, 18, 32, 50]
plt.plot(x, y1)
plt.plot(x, y2)
plt.title("Zwei Funktionen")
plt.xlabel("x")
plt.ylabel("y")
plt.grid(True)
plt.show()
Mit dem dritten Parameter können verschiedene Linien-Stile gewählt werden.
import matplotlib.pyplot as plt
x = [0, 1, 2, 3, 4, 5]
y = [0, 1, 4, 9, 16, 25]
plt.plot(x, y, "--") # Gestrichelte Linie
plt.title("Gestrichelte Linie")
plt.xlabel("x")
plt.ylabel("y")
plt.grid(True)
plt.show()
Wichtige Stile: "-" (durchgezogen), "--" (gestrichelt), "-." (Strich-Punkt), ":" (gepunktet)
Mit Markern werden die Datenpunkte sichtbar gemacht.
import matplotlib.pyplot as plt
x = [0, 1, 2, 3, 4, 5]
y = [0, 1, 4, 9, 16, 25]
plt.plot(x, y, "o") # Nur Kreise, keine Linie
plt.title("Datenpunkte")
plt.xlabel("x")
plt.ylabel("y")
plt.grid(True)
plt.show()
Wichtige Marker: "o" (Kreis), "s" (Quadrat), "^" (Dreieck), "*" (Stern), "+" (Plus), "x" (Kreuz)
Linien-Stil und Marker können kombiniert werden.
import matplotlib.pyplot as plt
x = [0, 1, 2, 3, 4, 5]
y = [0, 1, 4, 9, 16, 25]
plt.plot(x, y, "o-") # Kreise verbunden mit Linie
plt.title("Linie mit Markern")
plt.xlabel("x")
plt.ylabel("y")
plt.grid(True)
plt.show()
Farben können mit Buchstaben oder Namen angegeben werden.
import matplotlib.pyplot as plt
x = [0, 1, 2, 3, 4, 5]
y1 = [0, 1, 4, 9, 16, 25]
y2 = [0, 2, 8, 18, 32, 50]
plt.plot(x, y1, "r-") # Rot, durchgezogen
plt.plot(x, y2, "b--") # Blau, gestrichelt
plt.title("Farbige Linien")
plt.xlabel("x")
plt.ylabel("y")
plt.grid(True)
plt.show()
Wichtige Farbcodes: "r" (rot), "g" (grün), "b" (blau), "c" (cyan), "m" (magenta), "y" (gelb), "k" (schwarz)
Farben können auch mit vollständigen Namen angegeben werden.
import matplotlib.pyplot as plt
x = [0, 1, 2, 3, 4]
y = [0, 1, 4, 9, 16]
plt.plot(x, y, color="orange", linestyle="-", marker="o")
plt.title("Orangene Linie")
plt.xlabel("x")
plt.ylabel("y")
plt.grid(True)
plt.show()
Beispiele: "orange", "purple", "brown", "pink", "gray"
Farbe, Linien-Stil und Marker können in einem String kombiniert werden.
import matplotlib.pyplot as plt
x = [0, 1, 2, 3, 4, 5]
y1 = [0, 1, 4, 9, 16, 25]
y2 = [0, 2, 8, 18, 32, 50]
plt.plot(x, y1, "ro-") # Rot, Kreise, durchgezogen
plt.plot(x, y2, "bs--") # Blau, Quadrate, gestrichelt
plt.title("Kombinierte Stile")
plt.xlabel("x")
plt.ylabel("y")
plt.grid(True)
plt.show()
Format: "[farbe][marker][linie]", z.B. "ro-", "gs--", "b^:"
Kompakte Syntax zum Erstellen von Listen aus bestehenden Sequenzen.
Vergleich:
# Mit for-Schleife:
quadrate = []
for x in range(5):
quadrate.append(x ** 2)
print(quadrate)
# Mit List Comprehension:
quadrate = [x ** 2 for x in range(5)]
print(quadrate)
Viel kürzer und lesbarer!
Syntax:
neue_liste = [ausdruck for element in sequenz]
Weitere Beispiele:
# Buchstaben aus String extrahieren
buchstaben = [zeichen for zeichen in "Python"]
print(buchstaben)
# Celsius zu Fahrenheit
celsius = [0, 10, 20, 30]
fahrenheit = [c * 9/5 + 32 for c in celsius]
print(fahrenheit)
Vorteile:
Verwenden für:
Vermeiden wenn:
print())Faustregel: Wenn die Comprehension mehr als eine Zeile braucht, verwende eine normale Schleife!
Wozu sind List Comprehensions nützlich beim Plotten?
Beim Erstellen von Plots brauchen wir oft Datenreihen (x- und y-Werte).
# x-Werte von 0 bis 10 in 0.5er-Schritten
x = [i * 0.5 for i in range(21)]
print(x) # [0.0, 0.5, 1.0, 1.5, ..., 10.0]
# y-Werte als Quadrate der x-Werte
y = [xi ** 2 for xi in x]
print(y) # [0.0, 0.25, 1.0, 2.25, ..., 100.0]
Vorteil: Kompakt, lesbar und schnell!
Mit List Comprehensions können wir elegant mathematische Funktionen plotten.
import matplotlib.pyplot as plt
# x-Werte generieren
x = [i * 0.1 for i in range(101)] # 0.0 bis 10.0 in 0.1er-Schritten
# y-Werte mit Funktion berechnen
def f(x):
return x ** 2
y = [f(xi) for xi in x] # Mapping: Funktion auf jedes x anwenden
# Plotten
plt.plot(x, y, 'b-')
plt.title("Funktion f(x) = x²")
plt.xlabel("x")
plt.ylabel("f(x)")
plt.grid(True)
plt.show()
Darstellung einer Wurfparabel mit berechneten Werten.
import matplotlib.pyplot as plt
# Flugbahn berechnen (vereinfacht)
t_werte = [i * 0.5 for i in range(11)] # Zeit in Sekunden
x_werte = [t * 50 for t in t_werte] # Horizontale Distanz
y_werte = [t * 30 - 5 * t**2 for t in t_werte] # Höhe
plt.plot(x_werte, y_werte, 'b-o')
plt.title("Flugbahn eines geworfenen Balls")
plt.xlabel("Distanz (m)")
plt.ylabel("Höhe (m)")
plt.grid(True)
plt.show()
Wie hebt man einzelne Punkte hervor?
Einfach einen zweiten plot()-Aufruf mit nur den speziellen Punkten:
# Funktion als Linie
plt.plot(x, y, 'b-', label='Funktion')
# Spezielle Punkte als Marker
plt.plot([x1, x2], [y1, y2], 'ro', markersize=10, label='Nullstellen')
Wichtig:
plot()-Aufruf mit nur den Punktkoordinatenmarkersize ParameterErstellen Sie einen Plot mit drei mathematischen Funktionen für x-Werte von 0 bis 10.
Funktionen:
Anforderungen:
Plotten Sie die Funktion
Aufgaben:
Tipp: Die Nullstellen liegen bei
Wichtigste Funktionen:
plt.plot(x, y) – Linie zeichnenplt.title() – Titel setzenplt.xlabel(), plt.ylabel() – Achsen beschriftenplt.grid() – Gitter anzeigenplt.show() – Plot anzeigenStile:
'-', '--', '-.', ':''o', 's', '^', '*', '+', 'x''r', 'g', 'b', 'c', 'm', 'y', 'k' oder NamenKombination: 'ro-' = rot, Kreise, durchgezogen
Warum ist dieses Thema wichtig?
Themen:
Bit (Binary Digit) – kleinste Informationseinheit
Byte – Gruppe von 8 Bits
Beispiel:
1 Bit: 0 oder 1
1 Byte: 10110101 (8 Bits zusammen)
Historische Entwicklung:
Moderne Bedeutung:
int in Python: variabelint32 in NumPy: 4 Bytes = 32 Bitsfloat64: 8 Bytes = 64 BitsMit
| Bits | Anzahl Werte | Bereich (vorzeichenlos) | Beispiel |
|---|---|---|---|
| 1 | 2 | 0–1 | Boolesche Werte |
| 4 | 16 | 0–15 | Hexadezimal-Ziffer |
| 8 | 256 | 0–255 | 1 Byte, ASCII-Zeichen |
| 16 | 65.536 | 0–65.535 | uint16 |
| 32 | ~4,3 Mrd. | 0–4.294.967.295 | uint32, IPv4 |
| 64 | ~18 Trillionen | 0– |
uint64 |
Merke: Jedes zusätzliche Bit verdoppelt die Anzahl möglicher Werte!
Problem: Wie stellt man negative Zahlen dar?
Lösung: Ein Bit wird für das Vorzeichen verwendet
Wertebereich:
| Bits | Vorzeichenlos | Mit Vorzeichen |
|---|---|---|
| 8 | 0–255 | -128 bis 127 |
| 16 | 0–65.535 | -32.768 bis 32.767 |
| 32 | 0–~4,3 Mrd. | ~-2,1 Mrd. bis ~2,1 Mrd. |
In Python: int hat unbegrenzte Größe – kein Überlauf!
Problem: Zwei verschiedene Systeme für Speichergrößen!
SI-Präfixe (Dezimal, Basis 10):
Binärpräfixe (IEC-Standard, Basis 2):
Beispiel: 1 TB Festplatte
# Hersteller rechnet (SI):
si_bytes = 1_000_000_000_000 # 1 TB = 1.000 GB
# Betriebssystem rechnet (Binär):
gibibytes = si_bytes / (1024**3)
print(f"1 TB = {gibibytes:.2f} GiB") # ~931 GiB
Deshalb: Eine "1 TB" Festplatte zeigt im Betriebssystem nur ~931 GB an!
Aktueller Standard:
| Betriebssystem | Einheit | Basis | Kommentar |
|---|---|---|---|
| Windows | KB, MB, GB | 1024 | Binärpräfixe aber ohne "i" |
| macOS | KB, MB, GB | 1000 | SI-Präfixe aber mit K für Kilo |
| Linux/KDE | KiB, MiB, GiB | 1024 | IEC-Präfixe (korrekt) |
| Linux/Gnome | KB, MB, GB | 1000 | SI-Präfixe, aber mit K für Kilo |
# Wie viele Bytes sind 5 MiB?
mib = 5
bytes_wert = mib * 1024 * 1024
print(f"{mib} MiB = {bytes_wert:,} Bytes")
print(f"{mib} MiB = {bytes_wert / 1_000_000:.2f} MB (SI)")
# RAM-Größen sind typischerweise in Zweierpotenzen
ram_gb = 16 # "16 GB" RAM
ram_bytes = 16 * 1024**3 # Eigentlich GiB!
print(f"{ram_gb} GiB = {ram_bytes:,} Bytes")
print(f"{ram_gb} GiB = {ram_bytes / 1_000_000_000:.2f} GB (SI)")
Ein Stellenwertsystem repräsentiert Zahlen durch Ziffern an verschiedenen Positionen.
Allgemeine Form:
Wichtig: Die Ziffer
Unser Alltags-Zahlensystem
Beispiel: 5347
| Position | 3 | 2 | 1 | 0 |
|---|---|---|---|---|
| Stellenwert | ||||
| 1000 | 100 | 10 | 1 | |
| Ziffer | 5 | 3 | 4 | 7 |
| Wert | 5000 | 300 | 40 | 7 |
Die Sprache der Computer
Beispiel: 1011
| Position | 3 | 2 | 1 | 0 |
|---|---|---|---|---|
| Stellenwert | ||||
| 8 | 4 | 2 | 1 | |
| Ziffer | 1 | 0 | 1 | 1 |
| Wert | 8 | 0 | 2 | 1 |
Kompakte Darstellung für Binärzahlen
Beispiel: 2F3
| Position | 2 | 1 | 0 |
|---|---|---|---|
| Stellenwert | |||
| 256 | 16 | 1 | |
| Ziffer | 2 | F (15) | 3 |
| Wert | 512 | 240 | 3 |
4 Bit = 1 Hexadezimal-Ziffer – sehr praktisch!
| Binär | Hex | Dezimal | Binär | Hex | Dezimal | |
|---|---|---|---|---|---|---|
| 0000 | 0 | 0 | 1000 | 8 | 8 | |
| 0001 | 1 | 1 | 1001 | 9 | 9 | |
| 0010 | 2 | 2 | 1010 | A | 10 | |
| 0011 | 3 | 3 | 1011 | B | 11 | |
| 0100 | 4 | 4 | 1100 | C | 12 | |
| 0101 | 5 | 5 | 1101 | D | 13 | |
| 0110 | 6 | 6 | 1110 | E | 14 | |
| 0111 | 7 | 7 | 1111 | F | 15 |
Beispiel: 11010110 (binär) = D6 (hex) – viel kompakter!
Python unterstützt verschiedene Zahlensysteme direkt:
# Dezimal (Standard)
dezimal = 42
print(dezimal)
# Binär (Präfix 0b)
binaer = 0b101010
print(binaer) # Ausgabe in Dezimal: 42
print(bin(dezimal)) # Umwandlung zu Binär-String: '0b101010'
# Hexadezimal (Präfix 0x)
hexadezimal = 0x2A
print(hexadezimal) # Ausgabe in Dezimal: 42
print(hex(dezimal)) # Umwandlung zu Hex-String: '0x2a'
Mit int()-Funktion und Basis-Parameter:
# Binär → Dezimal
binaer_string = "101010"
dezimal = int(binaer_string, 2)
print(dezimal) # 42
# Hexadezimal → Dezimal
hex_string = "2A"
dezimal = int(hex_string, 16)
print(dezimal) # 42
# Auch mit Präfixen möglich
print(int("0b101010", 2)) # 42
print(int("0x2A", 16)) # 42
Methode: Stellenwertsystem-Formel anwenden
Algorithmus:
Beispiel:
Methode: Wiederholte Division mit Rest
Beispiel: 42 → Binär
Ergebnis (von unten nach oben):
Methode: Wiederholte Division mit Rest (wie bei Binär)
Beispiel: 755 → Hexadezimal
Ergebnis (von unten nach oben):
Probe:
Gegeben: Hex-Farbcode #FC5555
Aufgaben:
Hinweis: CSS-Farbcodes: #RRGGBB
Frage: Welche Farbe ergibt sich?
Zusatzaufgabe: #007CB0
Besonders einfach: 4 Binärziffern = 1 Hexadezimalziffer!
Binär → Hex: Gruppiere je 4 Bits von rechts
Beispiel:
1101 = D0110 = 6D6Hex → Binär: Jede Ziffer = 4 Bits
Beispiel: 2FA → Binär
2 = 0010, F = 1111, A = 10101011111010| Von → Nach | Methode | Python-Funktion |
|---|---|---|
| Dezimal → Binär | Division mit Rest | bin(x) |
| Dezimal → Hex | Division mit Rest | hex(x) |
| Binär → Dezimal | Stellenwertsystem | int(x, 2) |
| Binär → Hex | Über Dezimal oder 4-Bit-Gruppen | hex(int(x, 2)) |
| Hex → Dezimal | Stellenwertsystem | int(x, 16) |
| Hex → Binär | Über Dezimal oder jede Ziffer → 4 Bits | bin(int(x, 16)) |
Zwei Strategien:
Wie speichert der Computer Dezimalzahlen?
Problem:
Lösung: Gleitkommazahlen (Floating Point)
Dezimalzahlen mit Nachkommastellen in Binär
Wie bei Ganzzahlen: Stellenwertsystem, aber mit negativen Exponenten!
| Position | |||||
|---|---|---|---|---|---|
| Wert | 1 | 0,5 | 0,25 | 0,125 | 0,0625 |
Beispiel:
Beispiel:
Methode: Multiplikation mit Basis (statt Division)
Beispiel:
Probe:
Problem: Nicht alle Dezimalzahlen haben endliche Binärdarstellung!
Umrechnung
Ergebnis (von oben nach unten):
Probe zurück in Dezimal (erste Stellen):
Wie speichert der Computer Binärkommazahlen?
64-Bit Double Precision (Python float):
| Vorzeichen | Exponent | Mantisse |
|---|---|---|
| 1 Bit | 11 Bits | 52 Bits |
Format:
Beispiel: 0.75
1. ist implizit, nur .1 wird gespeichert)52-Bit-Mantisse ≈ 15–17 Dezimalstellen Genauigkeit
# Erinnerung: Rundungsfehler!
print(0.1 + 0.1 + 0.1) # 0.30000000000000004
print(0.1 + 0.1 + 0.1 == 0.3) # False
Warum?
Fazit: Niemals Gleitkommazahlen mit == vergleichen!
IEEE 754 definiert spezielle Werte:
# Unendlich (Division durch 0)
print(1.0 / 0.0) # inf
print(-1.0 / 0.0) # -inf
# Not a Number (ungültige Operationen)
print(0.0 / 0.0) # nan
print(float('inf') - float('inf')) # nan
# Testen
import math
x = float('inf')
print(math.isinf(x)) # True
y = float('nan')
print(math.isnan(y)) # True
Wertebereich von float (64-Bit):
Überlauf/Unterlauf:
print(1e308) # 1e+308
print(1e309) # inf (Überlauf!)
print(1e-324) # 5e-324
print(1e-325) # 0.0 (Unterlauf!)
Vermeiden:
# Direkte Gleichheitstests
if x == 0.3: # Gefährlich!
...
# Akkumulation kleiner Fehler
summe = 0.0
for i in range(1000000):
summe += 0.1 # Fehler akkumulieren sich!
Besser:
# Toleranz-basierter Vergleich
tolerance = 1e-9
if abs(x - 0.3) < tolerance:
...
# Für kritische Anwendungen: decimal-Modul
from decimal import Decimal
summe = Decimal('0.0')
for i in range(1000000):
summe += Decimal('0.1') # Exakt!
Dateiberechtigungen (Unix/Linux)
Die Oktalzahl 755 steht für Dateiberechtigungen: rwxr-xr-x
755 (Oktal) in Binär umUTF-8 Emoji
Das Emoji hat den Unicode
U+1F525 (Hexadezimal)
1F525 in Dezimal um10FFFF ist der höchste Wert)